package com.javaweb.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @desc: TODO: 使用注解 @NPECatch, 并使用@within, @annotation
 *            实现对类级别或方法级别的方法执行中的异常进行统一捕获处理。
 *            处理的逻辑为，输出在控制台。
 * @author:
 * @date:
 */
@Aspect
@Component
@Slf4j
public class NullExceptionAspect {
    /**
     * 定义一个切入点，匹配标记了@NPECatch注解的类或方法。
     */
    @Pointcut("@within(com.javaweb.aop.NPECatch) || @annotation(com.javaweb.aop.NPECatch)")
    public void catchExceptionPointcut() {}

    /**
     * 环绕通知，用于捕获执行过程中的异常。
     */
    @Around("catchExceptionPointcut()")
    public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
        try {
            return pjp.proceed();
        } catch (Throwable e) {
            log.error("Exception in method: {}, Exception: {}", pjp.getSignature().getName(), e.getMessage());
            throw e;
        }
    }


}


